#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/12/30 19:48
# @Author : George
import asyncio
import time
from threading import currentThread

"""
1.await 后面只能跟着一种对象，可等待对象(协程对象，task对象，future对象)
2.async和添加装饰器的效果是一样的，函数也会变成协程函数，协程函数+（）=>协程对象
3.await 换成自己定义的协程对象getIO(),失去异步效果，变为同步调用。原因：
- await可以单纯的理解为等，等后面的任务执行完毕再往下执行。如果后面的任务遇到了IO，asyncio会自动调度去执行其他任务
  但是造成IO的任务/函数，必须支持await 语法
  =========阻塞操作必须替换成为相应的异步库提供的函数=========
  time.sleep -> asyncio.sleep()
  server.accept -> loop.sock_accept()
  con.recv -> loop.sock_recv()
  发送http请求的 -> aiohttp
  操作数据库的 -> aiomysql
4.协程函数+（）=>协程对象，不会触发其内部代码的执行，必须使用await去触发其内部代码的执行
5.await只能在协程函数里面使用
"""

# async def getIO():
#     print("开始IO")
#     time.sleep(2)
#     print("结束IO")
#     return "hello"

async def getIO2():
    print("开始IO")
    await asyncio.sleep(4)
    print("结束IO")
    return "hello"

async def f1():
    print("f1开始执行",currentThread())
    data = await getIO2()
    print(f"f1 获取结果{data}")
    print("f1 结束执行",currentThread())

async def f2():
    print("f2开始执行",currentThread())
    data = await getIO2()
    print(f"f2 获取结果{data}")
    print("f2结束执行",currentThread())

asyncio.run(asyncio.wait([f1(),f2()]))